package com.saver.core.processor;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.annotation.SuppressLint;
import android.util.Log;

import com.saver.core.domain.MensajeTexto;
import com.saver.core.processor.util.Util;

public class BBVA extends GenericBankProcessorSMS implements ProcessorSMS {
	
	private static final String TAG = "ProcessorSMS-BBVA";
	
	private static final String PATRON_1 = "^BBVA CONTINENTAL\\s*CONFIRMACION DE OPERACION\\s*(.*)\\s*Importe ([,\\d]*\\.\\d*) (.*)\\s*Por orden de (.*) ((\\d\\d/\\d\\d/\\d{2,4} \\d\\d.\\d\\d.\\d\\d)|(\\d{8} \\d\\d.\\d\\d)|(\\d\\d/\\d\\d/\\d{2,4} \\d\\d.\\d\\d)|(\\d\\d/\\d\\d/\\d{2,4} \\d\\d.\\d\\d.))$";
	private static final String PATRON_2 = "^BBVA CONTINENTAL\\s*(.*): \\**(\\d*)\\s*(.*)\\s*(.*)\\s*([,\\d]*\\.\\d*)\\s*-\\s*(\\d\\d/\\d\\d)$";

	private static final String PATRON_FECHA_1 = "dd/MM/yy HH.mm.ss";
	private static final String PATRON_FECHA_2 = "yy/MM/dd";
	private static final String PATRON_FECHA_3 = "yyyyMMdd HH.mm";
	private static final String PATRON_FECHA_4 = "dd/MM/yy HH.mm";
	private static final String PATRON_FECHA_5 = "dd/MM/yy HH.mm.";
	
	@Override
	public TipoBanco tipoBanco () {
		return TipoBanco.BBVA;
	}

	@Override
	public boolean isValid(String sms) {
		return Pattern.matches(PATRON_1, sms) || Pattern.matches(PATRON_2, sms);
	}

	@SuppressLint("SimpleDateFormat")
	@Override
	public List<Token> process(MensajeTexto mensajeTexto) {
		ArrayList<Token> lista = new ArrayList<Token> (1);
		
		String sms = mensajeTexto.getBody();
		Log.d(TAG, sms);
		Pattern pattern = Pattern.compile(PATRON_1);
		Matcher matcher = pattern.matcher(sms);
		if (matcher.find()) {
				Token token = new Token (TipoBanco.BBVA, mensajeTexto.getDate());
				token.setCategoria(matcher.group(1).trim());
//				token.setEstablecimiento();
				try {
					SimpleDateFormat dateFormat = null;
					String fecha = null;
					if (Util.noEsVacio(matcher.group(6))) {
						fecha = matcher.group(6).trim();
						dateFormat = new SimpleDateFormat(PATRON_FECHA_1);
						
					} else if (Util.noEsVacio(matcher.group(7))) {
						fecha = matcher.group(7).trim();
						dateFormat = new SimpleDateFormat(PATRON_FECHA_3);
						
					} else if (Util.noEsVacio(matcher.group(8))) {
						fecha = matcher.group(8).trim();
						dateFormat = new SimpleDateFormat(PATRON_FECHA_4);
						
					} else if (Util.noEsVacio(matcher.group(9))) {
						fecha = matcher.group(9).trim();
						dateFormat = new SimpleDateFormat(PATRON_FECHA_5);
					}
					long fechaNum = dateFormat.parse(fecha).getTime();
					token.setFechaTransaccion(fechaNum);
				} catch (ParseException e) {
					Log.e(TAG, "error al parsear la fecha", e);
				}
				token.setImporte(Double.parseDouble(matcher.group(2).trim().replace(",", "")));
				token.setMoneda(matcher.group(3).trim());
//				token.setNumero();
//				token.setTipo();
				token.setTipoToken(TipoToken.EGRESO);
				
				lista.add(token);
			
		} else  {
			pattern = Pattern.compile(PATRON_2);
			matcher = pattern.matcher(sms);
			if (matcher.find()) {
				Token token = new Token (TipoBanco.BBVA, mensajeTexto.getDate());
//				token.setCategoria();
				token.setEstablecimiento(matcher.group(3).trim());
				try {
					Calendar calendar = Calendar.getInstance();
					calendar.setTimeInMillis(mensajeTexto.getDate());
					SimpleDateFormat dateFormat = new SimpleDateFormat(PATRON_FECHA_2);
					long fecha = dateFormat.parse(calendar.get(Calendar.YEAR) + "/" + matcher.group(6).trim()).getTime();
					token.setFechaTransaccion(fecha);
				} catch (ParseException e) {
					Log.e(TAG, "error al parsear la fecha", e);
				}
				token.setImporte(Double.parseDouble(matcher.group(5).trim().replace(",", "")));
				token.setMoneda(matcher.group(4).trim());
				token.setNumero(matcher.group(2).trim());
				token.setTipo(matcher.group(1).trim());
				token.setTipoToken(TipoToken.EGRESO);
				
				lista.add(token);
			}
		}
		
		return lista;
	}

	/*@Override
	public boolean isValid(String sms) {
		boolean esValido= false;
		if (procesarBBVA(sms).length()>0){
			esValido= true;
		}
		return esValido;
	}

	@Override
	public List<Token> process(MensajeTexto mensajeTexto) {
		String sms = mensajeTexto.getBody();
		Log.d(TAG, "mensaje: " + sms);
		ArrayList<Token> tokens = null;
		if(isValid(sms)){
			tokens = new ArrayList<Token> (1);
			
			Token token = new Token ();
			token.setTipoToken(TipoToken.EGRESO);
			token.setFecha(mensajeTexto.getDate()); // Amigo, obten la fecha desde el texto del mensaje
			token.setEstablecimiento(obtenerNombreEstablecimiento(sms));
			//token.setMoneda();
			token.setImporte(extraerImporte(sms));
			token.setDetalle(procesarBBVA(sms));
			
			token.setMensajeTexto(sms);
			
			tokens.add(token);	
		}		
		
		return tokens;
	}*/

//	@Override
//	public List<Transaccion> process(String sms, Date date) {
//		Transaccion transaccion = new Transaccion();
//		transaccion = new Transaccion();
//		transaccion.setIdBanco(2);
//		transaccion.setIdCategoria(null);
//		transaccion.setCuenta("");
//		transaccion.setFecha(date.getTime());
//		transaccion.setMonto(extraerImporte(sms));
////		transaccion.setDetalle(procesarBBVA(sms));
//		//transaccion.setIdEstablecimiento(obtenerNombreEstablecimiento(sms));
//		ArrayList<Transaccion> transaccions = new ArrayList<Transaccion> (1);
//		transaccions.add(transaccion);
//		return transaccions;
//	}

	/*public String procesarBBVA(String sms){
		String detalleGasto = "";
		//Efectivo Movil
		Pattern p = Pattern.compile("Efectivo Movil");
		Matcher m = p.matcher(sms);
		while (m.find()) { 
			detalleGasto = m.group();
		}
		if(detalleGasto.length()>0 && detalleGasto.indexOf("Cobrar")==-1){
			return detalleGasto;
		}
		
		//Transferencias Terceros
		p = Pattern.compile("Transferencias a Terceros|A CUENTAS DE TERCEROS");
		m = p.matcher(sms);
		while (m.find()) { 
			detalleGasto = m.group();
		}
		if(detalleGasto.length()>0){
			return detalleGasto;
		}
		//Pagos Claro
		p = Pattern.compile("Pagos Claro");
		m = p.matcher(sms);
		while (m.find()) { 
			detalleGasto = m.group();
		}
		if(detalleGasto.length()>0){
			return detalleGasto;
		}
		//Transferencia Interbancarias
		p = Pattern.compile("Transferencia Interbancarias");
		m = p.matcher(sms);
		while (m.find()) { 
			detalleGasto = m.group();
		}
		if(detalleGasto.length()>0){
			return detalleGasto;
		}
		//Pago de Telefonia Movil - Clar
		p = Pattern.compile("(Pago de Telefonia Movil - Clar)|(PAGOS A CLARO)");
		m = p.matcher(sms);
		while (m.find()) { 
			detalleGasto = m.group();
		}
		if(detalleGasto.length()>0){
			return detalleGasto;
		}
		//Pago instituciones
		p = Pattern.compile("PAGO INSTITUCIONES");
		m = p.matcher(sms);
		while (m.find()) { 
			detalleGasto = m.group();
		}
		if(detalleGasto.length()>0){
			return detalleGasto;
		}
		//Pago de Telefonia Movil - Clar
		p = Pattern.compile("TC:\\s\\*\\*");
		m = p.matcher(sms);
		while (m.find()) { 
			detalleGasto = m.group();
		}
		if(detalleGasto.length()>0){
			return detalleGasto;
		}
		return detalleGasto;
	}
	
	public String obtenerNombreEstablecimiento(String sms){
		String detalleGasto = "";
		String establecimiento = "";
		Pattern p = Pattern.compile("TC:\\s\\*\\*");
		Matcher m = p.matcher(sms);
		while (m.find()) { 
			detalleGasto = m.group();
		}
		if(detalleGasto.length()>0){
			sms = sms.replace("\n", "|");
			establecimiento = sms.split("\\|")[3];
		}
		return establecimiento;
	}*/
	
}
